package com.hl.util;

import java.lang.reflect.Field;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

public class DbUtil {

    /*
    * 封装增删改
    * */
    public static int update(Connection connection,String sql,Object... parameters){

        int num = 0;
        try(
                PreparedStatement statement = connection.prepareStatement(sql)
                ){
//            给？赋值
              if(parameters != null&&parameters.length>0){
                  for (int i = 0; i < parameters.length; i++) {
                      statement.setObject(i,parameters[i-1]);
                  }
              }
//            执行sql
                num = statement.executeUpdate();
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return num;
    }

        /*
        * 封装    查询方法
        * */
    public static  <T> List<T> query(Connection connection,String sql,Class clazz,Object... parameters){
        List<T> list = new ArrayList<>();
        ResultSet resultSet = null;

        try(PreparedStatement statement = connection.prepareStatement(sql);
        ){
            //给参数占位符赋值
            if(parameters != null&&parameters.length>0){
                for (int i = 0; i < parameters.length; i++) {
                    statement.setObject(i,parameters[i-1]);
                }
            }
            //执行sql
            resultSet = statement.executeQuery();

            //获取列数
            int columns = resultSet.getMetaData().getColumnCount();
            //封装结果集
            while (resultSet.next()){//循环每一行，一行循环一次
                //使用反射，动态创建一个类对象
                T t = (T) clazz.newInstance();
//                获取每一列的值
                for (int i = 0; i < columns; i++) {
                    //通过列的索引下标，获取当前列名
                    String columnName = resultSet.getMetaData().getColumnName(i+1);
                    //知道列名，列名与数据库中的列名一一对应
                    //获取列值
                    Object columnValue =resultSet.getObject(columnName);
                    //通过列名获取当前类中属性对象
                    Field field = clazz.getField(columnName);
//                   将列值存入到对象的属性值   封装到对象的属性
                    field.set(t,columnValue);
                }
                //将对象添加到集合中
                list.add(t);
            }
        }catch (Exception e){
            e.printStackTrace();
        }

        return list;
    }
}
